package com.mq.mqserver.core;

import lombok.Data;

import java.io.Serializable;
import java.util.UUID;

/**
 * 消息属性设置
 * 这里创建的消息是需要能够在网络上传输的,因此需要上传到文件中
 * 因此需要能够序列化和反序列化
 * 这里使用java标准库自带的序列化方法
 * 实现序列化 要继承Serializable接口
 */
@Data
public class Message implements Serializable {//继承序列化接口,后续消息需要序列化到文件中,然后发给消费者
    //消息的基本属性
    private BasicProperties basicProperties = new BasicProperties();
    //消息内容 字节数组,长度不固定
    private byte[] body;
    //这两个属性是为了能够在内存中找到在硬盘上对应的位置,因此在硬盘上就无需再进行序列化了,
    // 不对其进行序列化,仅需加上transient关键字修饰
    //transient关键字作用:被其修饰属性将不再被标准库序列化
    private transient long offsetBeg = 0;//消息在文件的起始位置
    private transient long offsetEnd = 0;//消息在文件的结束位置
    //消息在文件中是否有效
    //使用逻辑删除
    private byte isValid = 0x1;

    /**
     * 工使用厂方法创建 消息对象
     * 不使用构造方法创建消息,这种方式可以通过方法名知道消息中包含了声明
     * 并给消息分配一个唯一的id
     * @param routingKey 当basicProperties中已有routingKey时,让参数对其进行覆盖
     * @param basicProperties
     * @param body
     * @return
     */
    public static Message createMessageWithId(String routingKey,BasicProperties basicProperties,byte[] body){
        Message message = new Message();
        //消息的基本属性
        if(basicProperties!=null){
            message.basicProperties = basicProperties;
        }
        //消息内容
        message.body = body;
        //消息的绑定关系
        message.setRoutingKey(routingKey);
        //消息唯一Id: 以 M 作为消息的前缀
        message.setMessageId("M-"+ UUID.randomUUID());
        //剩余的消息属性在持久化的时候再设置
        return message;
    }

    public BasicProperties getBasicProperties() {
        return basicProperties;
    }
    public void setBasicProperties(BasicProperties bsicProperties){
        this.basicProperties = bsicProperties;
    }

    public String getMessageId(){
        return basicProperties.getMessageId();
    }
    public void setMessageId(String messageId){
        basicProperties.setMessageId(messageId);
    }

    public void setRoutingKey(String routingKey){
        basicProperties.setRoutingKey(routingKey);
    }

    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }
    //是否删除:
    public int getDeliveryMode(){
        return basicProperties.getDeliveryMode();
    }
    public void setDeliveryMode(int deliveryMode){
        basicProperties.setDeliveryMode(deliveryMode);
    }

}
